//给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。 
//
// 
// 如果剩余字符少于 k 个，则将剩余字符全部反转。 
// 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "abcdefg", k = 2
//输出："bacdfeg"
// 
//
// 示例 2： 
//
// 
//输入：s = "abcd", k = 2
//输出："bacd"
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 104 
// s 仅由小写英文组成 
// 1 <= k <= 104 
// 
// Related Topics 双指针 字符串 
// 👍 216 👎 0

package leetcode.editor.cn;
/**
 * [541]反转字符串 II
 */
public class ReverseStringIi {
    public static void main(String[] args) {
        Solution solution = new ReverseStringIi().new Solution();
        String result = "";
        result = solution.reverseStr("abcdefg", 2);
        if (!result.equals("bacdfeg")) {
            System.out.println("--1--");
        }

        result = solution.reverseStr("abcd", 2);
        if (!result.equals("bacd")) {
            System.out.println("--2--");
        }

        result = solution.reverseStr("abcdefg", 4);
        if (!result.equals("dcbaefg")) {
            System.out.println("--2--");
        }
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    // 个人
    public String reverseStr2(String s, int k) {
        StringBuilder result = new StringBuilder();
        int i = 0;
        while (2*k*i + 2*k <= s.length()) {
            for (int j = k + 2*k*i-1; j >= 2*k*i; j--) {
                result.append(s.charAt(j));
            }
            String temp = s.substring(k + 2*k*i, 2*k*(i+1));
            result.append(temp);
            i++;
        }

        int j;
        if (k + 2*k*i <= s.length()) {
            j = k + 2*k*i-1;
        } else {
            j = s.length()-1;
        }
        for (; j >= 2*k*i; j--) {
            result.append(s.charAt(j));
        }

        for (int m = k + 2*k*i; m < s.length(); m++) {
            result.append(s.charAt(m));
        }
        return result.toString();
    }

    // 优化
    public String reverseStr(String s, int k) {
        StringBuilder result = new StringBuilder();
        int start = 0;
        int circle = 0;
        while (start < s.length()) {
            int end = start + k;
            if (end > s.length()) {
                end = s.length();
            }
            StringBuilder temp = new StringBuilder();
            temp.append(s.substring(start, end));

            if (circle % 2 == 0) {
                temp.reverse();
            }
            result.append(temp);
            circle++;
            start = circle*k;
        }
        return result.toString();
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}